#ifndef _COOLANGAGE_VISITOR_INSTRUCTION_H_
#define _COOLANGAGE_VISITOR_INSTRUCTION_H_

namespace COOLangage {
  class VisitorInstruction;
}
#include "VisitorExpression.h"
#include "Instruction.h"

namespace COOLangage {
  class VisitorInstruction {
  protected:
    VisitorInstruction() { }
  public:
    virtual ~VisitorInstruction() throw() { }

    virtual VisitorResult visit(Instruction *e) = 0;

    virtual VisitorResult visitInstruction(Instruction *e) = 0;
    virtual VisitorResult visitBloc(Bloc *b) = 0;
    virtual VisitorResult visitSequence(Sequence *s) = 0;
    virtual VisitorResult visitConditionnelle(Conditionnelle *c) = 0;
    virtual VisitorResult visitExprInstruction(ExprInstruction *e) = 0;
    virtual VisitorResult visitInstructionReturn(InstructionReturn *r) = 0;
    virtual VisitorResult visitBoucle(Boucle *b) = 0;
    virtual VisitorResult visitAffectation(Affectation *a) = 0;
    virtual VisitorResult visitDeclarationVariable(DeclarationVariable *d) = 0;
  };
}
/*
 * Une autre méthode aurait de faire une classe VisitorInstruction qui n'hérite pas de du visiteur sur les expressions, mais inclut un visiteur sur les expressions en tant que variable privée. 

 cf. VisitorProgram.h
*/

#endif
